/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tubosmonterrey.cotizador.sql;

import com.tubosmonterrey.cotizador.sql.exceptions.IllegalOrphanException;
import com.tubosmonterrey.cotizador.sql.exceptions.NonexistentEntityException;
import com.tubosmonterrey.cotizador.sql.exceptions.PreexistingEntityException;
import com.tubosmonterrey.cotizador.tb.Tbcotizacion;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.tubosmonterrey.cotizador.tb.Tbiva;
import com.tubosmonterrey.cotizador.tb.Tbclientes;
import com.tubosmonterrey.cotizador.tb.TbcotizacionPos;
import java.util.ArrayList;
import java.util.Collection;

/**
 *
 * @author rsoberanis
 */
public class TbcotizacionJpaController implements Serializable {

    public TbcotizacionJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Tbcotizacion tbcotizacion) throws PreexistingEntityException, Exception {
        if (tbcotizacion.getTbcotizacionPosCollection() == null) {
            tbcotizacion.setTbcotizacionPosCollection(new ArrayList<TbcotizacionPos>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbiva iva = tbcotizacion.getIva();
            if (iva != null) {
                iva = em.getReference(iva.getClass(), iva.getId());
                tbcotizacion.setIva(iva);
            }
            Tbclientes cliente = tbcotizacion.getCliente();
            if (cliente != null) {
                cliente = em.getReference(cliente.getClass(), cliente.getId());
                tbcotizacion.setCliente(cliente);
            }
            Collection<TbcotizacionPos> attachedTbcotizacionPosCollection = new ArrayList<TbcotizacionPos>();
            for (TbcotizacionPos tbcotizacionPosCollectionTbcotizacionPosToAttach : tbcotizacion.getTbcotizacionPosCollection()) {
                tbcotizacionPosCollectionTbcotizacionPosToAttach = em.getReference(tbcotizacionPosCollectionTbcotizacionPosToAttach.getClass(), tbcotizacionPosCollectionTbcotizacionPosToAttach.getTbcotizacionPosPK());
                attachedTbcotizacionPosCollection.add(tbcotizacionPosCollectionTbcotizacionPosToAttach);
            }
            tbcotizacion.setTbcotizacionPosCollection(attachedTbcotizacionPosCollection);
            em.persist(tbcotizacion);
            if (iva != null) {
                iva.getTbcotizacionCollection().add(tbcotizacion);
                iva = em.merge(iva);
            }
            if (cliente != null) {
                cliente.getTbcotizacionCollection().add(tbcotizacion);
                cliente = em.merge(cliente);
            }
            for (TbcotizacionPos tbcotizacionPosCollectionTbcotizacionPos : tbcotizacion.getTbcotizacionPosCollection()) {
                Tbcotizacion oldTbcotizacionOfTbcotizacionPosCollectionTbcotizacionPos = tbcotizacionPosCollectionTbcotizacionPos.getTbcotizacion();
                tbcotizacionPosCollectionTbcotizacionPos.setTbcotizacion(tbcotizacion);
                tbcotizacionPosCollectionTbcotizacionPos = em.merge(tbcotizacionPosCollectionTbcotizacionPos);
                if (oldTbcotizacionOfTbcotizacionPosCollectionTbcotizacionPos != null) {
                    oldTbcotizacionOfTbcotizacionPosCollectionTbcotizacionPos.getTbcotizacionPosCollection().remove(tbcotizacionPosCollectionTbcotizacionPos);
                    oldTbcotizacionOfTbcotizacionPosCollectionTbcotizacionPos = em.merge(oldTbcotizacionOfTbcotizacionPosCollectionTbcotizacionPos);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findTbcotizacion(tbcotizacion.getId()) != null) {
                throw new PreexistingEntityException("Tbcotizacion " + tbcotizacion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Tbcotizacion tbcotizacion) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbcotizacion persistentTbcotizacion = em.find(Tbcotizacion.class, tbcotizacion.getId());
            Tbiva ivaOld = persistentTbcotizacion.getIva();
            Tbiva ivaNew = tbcotizacion.getIva();
            Tbclientes clienteOld = persistentTbcotizacion.getCliente();
            Tbclientes clienteNew = tbcotizacion.getCliente();
            Collection<TbcotizacionPos> tbcotizacionPosCollectionOld = persistentTbcotizacion.getTbcotizacionPosCollection();
            Collection<TbcotizacionPos> tbcotizacionPosCollectionNew = tbcotizacion.getTbcotizacionPosCollection();
            List<String> illegalOrphanMessages = null;
            for (TbcotizacionPos tbcotizacionPosCollectionOldTbcotizacionPos : tbcotizacionPosCollectionOld) {
                if (!tbcotizacionPosCollectionNew.contains(tbcotizacionPosCollectionOldTbcotizacionPos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain TbcotizacionPos " + tbcotizacionPosCollectionOldTbcotizacionPos + " since its tbcotizacion field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (ivaNew != null) {
                ivaNew = em.getReference(ivaNew.getClass(), ivaNew.getId());
                tbcotizacion.setIva(ivaNew);
            }
            if (clienteNew != null) {
                clienteNew = em.getReference(clienteNew.getClass(), clienteNew.getId());
                tbcotizacion.setCliente(clienteNew);
            }
            Collection<TbcotizacionPos> attachedTbcotizacionPosCollectionNew = new ArrayList<TbcotizacionPos>();
            for (TbcotizacionPos tbcotizacionPosCollectionNewTbcotizacionPosToAttach : tbcotizacionPosCollectionNew) {
                tbcotizacionPosCollectionNewTbcotizacionPosToAttach = em.getReference(tbcotizacionPosCollectionNewTbcotizacionPosToAttach.getClass(), tbcotizacionPosCollectionNewTbcotizacionPosToAttach.getTbcotizacionPosPK());
                attachedTbcotizacionPosCollectionNew.add(tbcotizacionPosCollectionNewTbcotizacionPosToAttach);
            }
            tbcotizacionPosCollectionNew = attachedTbcotizacionPosCollectionNew;
            tbcotizacion.setTbcotizacionPosCollection(tbcotizacionPosCollectionNew);
            tbcotizacion = em.merge(tbcotizacion);
            if (ivaOld != null && !ivaOld.equals(ivaNew)) {
                ivaOld.getTbcotizacionCollection().remove(tbcotizacion);
                ivaOld = em.merge(ivaOld);
            }
            if (ivaNew != null && !ivaNew.equals(ivaOld)) {
                ivaNew.getTbcotizacionCollection().add(tbcotizacion);
                ivaNew = em.merge(ivaNew);
            }
            if (clienteOld != null && !clienteOld.equals(clienteNew)) {
                clienteOld.getTbcotizacionCollection().remove(tbcotizacion);
                clienteOld = em.merge(clienteOld);
            }
            if (clienteNew != null && !clienteNew.equals(clienteOld)) {
                clienteNew.getTbcotizacionCollection().add(tbcotizacion);
                clienteNew = em.merge(clienteNew);
            }
            for (TbcotizacionPos tbcotizacionPosCollectionNewTbcotizacionPos : tbcotizacionPosCollectionNew) {
                if (!tbcotizacionPosCollectionOld.contains(tbcotizacionPosCollectionNewTbcotizacionPos)) {
                    Tbcotizacion oldTbcotizacionOfTbcotizacionPosCollectionNewTbcotizacionPos = tbcotizacionPosCollectionNewTbcotizacionPos.getTbcotizacion();
                    tbcotizacionPosCollectionNewTbcotizacionPos.setTbcotizacion(tbcotizacion);
                    tbcotizacionPosCollectionNewTbcotizacionPos = em.merge(tbcotizacionPosCollectionNewTbcotizacionPos);
                    if (oldTbcotizacionOfTbcotizacionPosCollectionNewTbcotizacionPos != null && !oldTbcotizacionOfTbcotizacionPosCollectionNewTbcotizacionPos.equals(tbcotizacion)) {
                        oldTbcotizacionOfTbcotizacionPosCollectionNewTbcotizacionPos.getTbcotizacionPosCollection().remove(tbcotizacionPosCollectionNewTbcotizacionPos);
                        oldTbcotizacionOfTbcotizacionPosCollectionNewTbcotizacionPos = em.merge(oldTbcotizacionOfTbcotizacionPosCollectionNewTbcotizacionPos);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = tbcotizacion.getId();
                if (findTbcotizacion(id) == null) {
                    throw new NonexistentEntityException("The tbcotizacion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbcotizacion tbcotizacion;
            try {
                tbcotizacion = em.getReference(Tbcotizacion.class, id);
                tbcotizacion.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The tbcotizacion with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<TbcotizacionPos> tbcotizacionPosCollectionOrphanCheck = tbcotizacion.getTbcotizacionPosCollection();
            for (TbcotizacionPos tbcotizacionPosCollectionOrphanCheckTbcotizacionPos : tbcotizacionPosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Tbcotizacion (" + tbcotizacion + ") cannot be destroyed since the TbcotizacionPos " + tbcotizacionPosCollectionOrphanCheckTbcotizacionPos + " in its tbcotizacionPosCollection field has a non-nullable tbcotizacion field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Tbiva iva = tbcotizacion.getIva();
            if (iva != null) {
                iva.getTbcotizacionCollection().remove(tbcotizacion);
                iva = em.merge(iva);
            }
            Tbclientes cliente = tbcotizacion.getCliente();
            if (cliente != null) {
                cliente.getTbcotizacionCollection().remove(tbcotizacion);
                cliente = em.merge(cliente);
            }
            em.remove(tbcotizacion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Tbcotizacion> findTbcotizacionEntities() {
        return findTbcotizacionEntities(true, -1, -1);
    }

    public List<Tbcotizacion> findTbcotizacionEntities(int maxResults, int firstResult) {
        return findTbcotizacionEntities(false, maxResults, firstResult);
    }

    private List<Tbcotizacion> findTbcotizacionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Tbcotizacion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Tbcotizacion findTbcotizacion(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Tbcotizacion.class, id);
        } finally {
            em.close();
        }
    }

    public int getTbcotizacionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Tbcotizacion> rt = cq.from(Tbcotizacion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
